package com.exm.collectcodenew.juc.aqs;

import java.util.concurrent.CountDownLatch;
//这里总结下CountDownLatch与join方法的区别。一个区别是,调用一个子线程的join()方法后，该线程会一直被阻塞直到子线程运行完毕，
// 而CountDownLatch则使用计数器来允许子线程运行完毕或者在运行中递减计数，也就是CountDownLatch可以在子线程运行的任何时候让 await 方法返回而不一定必须等到线程结束。
// 另外，使用线程池来管理线程时一般都是直接添加 Runable到线程池，这时候就没有办法再调用线程的join 方法了，
// 就是说 countDownLatch 相比ioin 方法让我们对线程同步有更灵活的控制。

public class JoinCountDownLatch {
    //创建一个CountDownLatch实例
    private static volatile CountDownLatch countDownLatch = new CountDownLatch(2);

    public static void main(String[] args) throws InterruptedException {
        Thread threadOne =  new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(1000);
                    System.out.println("child threadOne over!");
                } catch (InterruptedException e) {
                   e.printStackTrace();
                }finally {
                    countDownLatch.countDown();
                }
            }
        });
        Thread threadTwo =  new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(1000);
                    System.out.println("child threadTwo over!");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }finally {
                    countDownLatch.countDown();
                }
            }
        });
        //启动线程
        threadOne.start();
        threadTwo.start();
        System.out.println("wait all Child thread over!");
        //等待子线程执行完毕，返回
        countDownLatch.await();
        System.out.println("all Child thread over!");
    }

}
